package com.yangrui.app.interceptor;

import org.springframework.http.HttpMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author JoeZhou
 */
public class CorsInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse resp, Object handler) {

        // 表示接受任意域名的请求，也可以指定域名
        resp.setHeader("Access-Control-Allow-Origin", request.getHeader("origin"));

        // 可选，允许跨域携带cookie
        resp.setHeader("Access-Control-Allow-Credentials", "true");

        // 允许跨域发送列表中的所有请求类型
        resp.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS");

        // 允许跨域发送全部请求头类型
        resp.setHeader("Access-Control-Allow-Headers", "*");

        /*
         * 浏览器在发送一些复杂跨域请求之前，会先发送一次OPTIONS预检请求，用于试探服务器响应是否正常，即是否能接收真正的请求
         * 若能，则发出正式请求，若不能，如返回500，则取消真正的请求
         */
        if(HttpMethod.OPTIONS.toString().equals(request.getMethod())){
            // 预检请求直接放行
            return true;
        }

        return true;
    }
}
